package com.atguigu.rabbitmq.day03;

import com.atguigu.rabbitmq.utils.RabbitMqUtils;
import com.atguigu.rabbitmq.utils.SleepUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import com.rabbitmq.client.Delivery;

//本次测试是为了验证消息在手动应答时是不丢失的，会放回到队列中重新消费
public class Worker03 {
    public static  final String task_queue_name="ack_queue";
    //接收消息
    public static void main(String[] args) throws Exception{
        Channel channel = RabbitMqUtils.getChannel();
        System.out.println("C1等待接收消息，处理时间较短");

        DeliverCallback deliverCallback=( consumerTag,  message)->{
            //沉睡1s
            SleepUtils.sleep(1);//沉睡一秒，因为工具类里乘了1000,1就是1秒
            /*怕乱码可以在new String的时候写上第二个参数“UTF-8”*/
            System.out.println("接受到的消息"+new String(message.getBody(),"Utf-8"));
            //手动应答
            /**
             * 各参数意义
             * 1.消息的标记 类似是消息的主键(message.getEnvelope().getDeliveryTag()有点长)
             * 2.是否批量应答 false表示不批量应答信道中的消息 true表示批量
             */
            channel.basicAck(message.getEnvelope().getDeliveryTag(),false);
        };


        //设置不公平分发
        //int prefetchCount=1;
        //设置欲取值
        int prefetchCount=2;
        channel.basicQos(prefetchCount);//默认是0 代表轮询策略 改成1后就是不公平分发
        //采用手动应答
        boolean autoAck=false;
        channel.basicConsume(task_queue_name,autoAck,deliverCallback,(consumerTag -> {
            /*可以把取消消息的回调CancelCallback直接写在basicConsume方法里，不用拆出来写，但是basicConsume的后两个参数不能写null，你里边可以没有东西，但是不能是null*/
            System.out.println(consumerTag+"消费者取消消费接口回调逻辑");
        }));

    }
}
/*注：写好的新的一套生产者和消费者，应该先执行生产者从而把队列名队列ack_queue存到rabbitMQ那个后台管理系统中，然后消费者执行basicConsume的时候
* 才能拿到队列，如果先执行消费者会报错*/